<?php

class AdminObjetoController extends BaseController {
    
    use HandleImagesTrait, OrderEntityTrait; // traits para addImagesToEntidad() & ordenarEntidades()

    public function ordenar() {
        $this->ordenarEntidades(Input::get('items'), 'Objeto');
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index() {
        // get all the objetos
        // Eager Loading -> reduce cantidad de queries 
        // http://laravel.com/docs/eloquent#eager-loading
        $objetos = Objeto::orderBy('position')->with('tags')->get();
        // load the view and pass the objetos
        return View::make('admin.objetos.index', ['objetos' => $objetos]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create() {
        $tags = TagObj::getTagSinAnonima()->lists('nombre', 'id');
        return View::make('admin.objetos.create', ['tags' => $tags]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store() {
        // validate campos Objeto
        $validatorObj = Validator::make(Input::all(), Objeto::$rules);
        
        // validate imagenes
        foreach (Input::file('files') as $file) {
            $validatorImg = Imageobj::validate(['file' => $file]);
            if ($validatorImg->fails()) {
                return Redirect::back()->withErrors($validatorImg)->withInput();
            }
        }

        // process the form
        if ($validatorObj->fails()) {
              return Redirect::back()->withErrors($validatorObj)->withInput();
        } else {

            // crea el slug a partir del nombre
            $nombre = Input::get('nombre');
            $slug = Str::slug($nombre, $separator = '-');

            // store
            $objeto = new Objeto;
            $objeto->nombre = $nombre;
            $objeto->descripcion = Input::get('descripcion');
            $objeto->slug = $slug;
            $objeto->link = Input::get('link');
            $objeto->link_name = Input::get('link_name');
            $objeto->position = 0;
            $objeto->estado = Input::get('estado');

            // Transaccion
            // incrementa las posiciones de todos los objetos de la tabla
            // luego crea el nuevo objeto en la tabla con pos = 1
            // orderBy es necesario para no violar la restriccion 
            // unique de position en el incremento
            // sync() actualiza los registros en tabla pivot
            
            DB::transaction(function($objeto) use ($objeto) {
                DB::table('objetos')
                    ->orderBy('position', 'desc')
                    ->where('position', '>=', 0)
                    ->increment('position');
                $objeto->save();
                $objeto->tags()->sync(array(Input::get('tags')));
                // Sincroniza un array de valores (select multiple)
                // $objeto->tags()->sync(Input::get('tags'));
            });
            
            //Image managing
            if(Input::hasFile('files')){
                $this->addImagesToEntidad(Input::file('files'), $objeto, 'objeto_id', 'imageobj_objeto', 'Imageobj');
            }
            // redirect
            Session::flash('message', 'El nuevo objeto fue creado');
            return Redirect::to('admin/objetos');
        }        
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id) {

        $objeto = Objeto::with([
                    'firstTag' => function($query) {
                        $query->select('nombre');
                    }
                ])
            ->find($id);

        if( is_null($objeto) ) {
            App::abort(404);
        }

        $tag = $objeto->firstTag->first(); // le pasamos el objeto
        $images = $objeto->imagesOrdered;

        return View::make('admin.objetos.show', compact('objeto', 'tag', 'images'));



//         get the objeto
//        $objeto = Objeto::find($id);

        // show the view and pass the objeto to it
//        return View::make('admin.objetos.show', ['objeto' => $objeto]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id) {
        // get the objeto
        $objeto = Objeto::with('tags')->find($id);
        $tags = TagObj::getTagList();
        $images = $objeto->imagesOrdered;
        $entidad = 'objeto';
        // show the edit form and pass the nerd
        return View::make('admin.objetos.edit', ['objeto' => $objeto, 'tags' => $tags, 'images' => $images, 'entidad' => $entidad]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    
    // This controller method will process the edit form. 
    // It is very similar to store(). We will validate, update, and redirect.
    
    public function update($id) {
        // validate campos Objeto
        // $validatorObj = Objeto::validate(Input::all());
        $validatorObj = Validator::make(Input::all(), Objeto::$rules);
        
        // validate imagenes
        foreach (Input::file('files') as $file) {
            $validatorImg = Imageobj::validate(['file' => $file]);
            if ($validatorImg->fails()) {
                return Redirect::back()->withErrors($validatorImg)->withInput();
            }
        }

        // process Objeto
        if ($validatorObj->fails()) {
            return Redirect::back()->withErrors($validatorObj)->withInput();
        } 
        else {
            // crea el slug a partir del nombre
            $nombre = Input::get('nombre');
            $slug = Str::slug($nombre, $separator = '-');

            // store
            $objeto = Objeto::find($id);
            $objeto->nombre = $nombre;
            $objeto->descripcion = Input::get('descripcion');
            $objeto->slug = $slug;
            $objeto->link = Input::get('link');
            $objeto->link_name = Input::get('link_name');
            // position no cambia;
            $objeto->estado = Input::get('estado');
            $dt = new DateTime;
            // created_at no cambia;
//            $objeto->updated_at = $dt;
            
            DB::transaction(function($objeto) use ($objeto) {
                $objeto->save();
                $objeto->tags()->sync(array(Input::get('tags')));
            });

            //Image managing
            if(Input::hasFile('files')){
                $this->addImagesToEntidad(Input::file('files'), $objeto, 'objeto_id', 'imageobj_objeto', 'Imageobj');
            }

            // redirect
            Session::flash('message', 'Objeto modificado');
            return Redirect::to('admin/objetos');
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id) {
        // delete
        $objeto = Objeto::find($id);
        
        DB::transaction(function($objeto) use ($objeto) {
            
            foreach($objeto->images as $img){
                $img->delete();
            }
            $objeto->delete();

            DB::table('objetos')
                    ->orderBy('position')
                    ->where('position', '>', $objeto->position)
                    ->decrement('position');
        });
        
        // redirect
        Session::flash('message', 'Eliminación exitosa');
        return Redirect::to('admin/objetos');
    }
}
